プロ ジェクトホーム >> トップページ >> 開発に参加したい方へ >> cvs2svnによるリポジトリ変換

cvs2svnによるリポジトリ変換

2006.03.18

Sourceforge.netのSubversionリポジトリにソースコードを登録すべくcvs2svnでcvsリポジトリの変換 を行った記録です.

用意した物

最初はcygwinを使おうとしたが,どうも怪しいのでやめた.

Python,Subversionはインストーラでインストールした上で環境変数でパスを通しておく.TortoiseSVNはイン ストーラでインストール.sort, tee, coと関連dllは面倒くさいのでcvs2svnを展開したディレクトリにコピー.

cvs2svnの取得

http://cvs2svn.tigris.orgに てリ リース版1.3.0が公開されているが,それを使ってはいけない.上でインストールしたTortoiseSVNを使って http://cvs2svn.tigris.org/svn/cvs2svn/trunk/ から取得する.空のディレクトリを作成してそこで右クリック.「SVN Checkout」を選んで上のURLを指定.認証を求められるのでuser/pass にguest/guestを入力.

リリース版を使わない最大の理由はその速度.リリース版に比べて10倍のスピードアップが図られている.また,今回使う--auto- propsというオプションもリリース版ではサポートされていない.(cvs2svn.htmlには既に載っている)

今回取得したcvs2svnはRevision 1793のもの.取得したらsort, tee, coをその中へコピー.

cvs2svnの変更

不都合な点があったので,以下の変更を加えた.

Index: cvs2svn
===================================================================
--- cvs2svn (revision 1803)
+++ cvs2svn (working copy)
@@ -532,7 +532,7 @@

self.cvs_module = module_component + "/" + self.cvs_module

- os.environ['CVSROOT'] = self.cvs_repository_root
+ os.environ['CVSROOT'] = ":local:" + self.cvs_repository_root

def cvs_ok(global_arguments):
check_command_runs(
@@ -4793,7 +4793,7 @@
return s

def _add_pattern(self, pattern, value):
- props = value.split(';')
+ props = value.split(';;')
propdict = {}
for prop in props:
s = prop.split('=', 1)

CVSROOTにWindowsパスを設定するところで,cvsがそれを理解しないためエラーとなる.それを防ぐためCVSROOTの 設定箇所で先頭に無理矢理 :local: を付ける.(前回1.3.0+cvsを使って試したときは必要だったが,今回は不要だったかも)

propsによるファイルパターンによるproperty設定箇所でセミコロンを値に含むプロパティが記述できないので,区切り文字を セミコロン1つから2つに変更してセミコロンを値として解釈できるようにした.

auto-propsファイルの作成

拡張子やファイルパターに応じて自動的にプロパティを設定させるため,以下の内容のファイルをcvs2svn.configとして作 成.

[auto-props]
*.c = svn:eol-style=native;;svn:mime-type=text/plain;charset=SHIFT_JIS
*.cpp = svn:eol-style=native;;svn:mime-type=text/plain;charset=SHIFT_JIS
*.h = svn:eol-style=native;;svn:mime-type=text/plain;charset=SHIFT_JIS
*.hm = svn:eol-style=native;;svn:mime-type=text/plain;charset=SHIFT_JIS
*.hh = svn:eol-style=native;;svn:mime-type=text/plain;charset=SHIFT_JIS
*.dsp = svn:eol-style=CRLF;;svn:mime-type=text/plain;charset=SHIFT_JIS
*.dsw = svn:eol-style=CRLF;;svn:mime-type=text/plain;charset=SHIFT_JIS
*.txt = svn:eol-style=native;;svn:mime-type=text/plain;charset=SHIFT_JIS
*.rc = svn:eol-style=native;;svn:mime-type=text/plain;charset=SHIFT_JIS
*.mak = svn:eol-style=native;;svn:mime-type=text/plain;charset=SHIFT_JIS
*.def = svn:eol-style=native;;svn:mime-type=text/plain
*.png = svn:mime-type=image/png
*.jpg = svn:mime-type=image/jpeg
*.bmp = svn:mime-type=image/bmp
*.ico = svn:mime-type=image/x-icon
*.cur = svn:mime-type=application/octet-stream
Makefile = svn:eol-style=native;;svn:mime-type=text/plain;charset=SHIFT_JIS
README = svn:eol-style=native;;svn:mime-type=text/plain
.cvsignore = svn:eol-style=native;;svn:mime-type=text/plain

このリストに(過去にあったファイルも含めて)もれなく設定するために実際には以下のような手順を踏んだ.

  1. auto-propsファイルを作成
  2. リポジトリ変換を実行
  3. ログの中から{}を検索 (プロパティ未設定のファイルを意味する)
  4. 見つからなければ成功.
  5. 見つかった場合にはauto-propsファイルへ抜けていたパターンを追加

charsetの設定はTracを使う場合には文字化け対策の意味を持つが,ViewVCを使っているSourceforge.net では特に意味をなさない.だが,将来的に意味を持つと期待して設定することにした.

cvsリポジトリの整理

CVSの中で新リポジトリに変換するのが望ましくないファイルを変換対象から除外.サクラエディタでは過去に以下のようなファイルが含 まれていた.

最新のリポジトリをコピーして望ましくないリビジョンファイルを削除した.

.cvsignoreはSubversionでは意味を持たないが,cvs2svnが.cvsignoreの中身を自動的にフォルダに Propertyとして設定してくれるので先に削除はしない.

ラベルの変換

CVSではラベル名にピリオドが使えなかったが,Subversionでは使えるので,この際変換することにした.また,意味を持たな いラベルを除外した.

変換は--symbol-transform="変換前:変換後"で,変換前で(パターン1)とした部分を変換後の方で\1として (sed みたいに)参照できる.このオプションは複数設定可能.

除外したいラベルは--excludeで指定.こちらは正規表現の(|)を使ってたくさんあっても1つにまとめて指定できる.除外はシ ンボル変換の後で処理されるので変換後のパターンで指定する必要がある.

実行

どのように変換するか決まったら実行.teeを使ってログファイルに落とす.CVSリポジトリにはsakuraとBregexpが入っ ているので,それぞれを別々にダンプファイルに変換して,サブディレクトリに読み込ませることにする.

sakura (実 行ログ)
python cvs2svn --dump-only --dumpfile=sakura.dump --encoding=SHIFT_JIS --symbol-transform="U?R([0-9]+)_([0-9]+)_([0-9]+)_([0-9].*):R\1.\2.\3.\4" --symbol-transform="Intermission:merge1.3_to_trunk" --symbol-transform="DEV_1_(.*):dev-1.\1" --symbol-transform="NN:original" --auto-props=cvs2svn.config --auto-props-ignore-case .\sakura | tee sakura.log
Bregexp (実行ログ)
python cvs2svn -v --dump-only --dumpfile=bregexp.dump --encoding=SHIFT_JIS --symbol-transform="V([0-9])_([0-9])_([0-9].*):V\1.\2.\3" --symbol-transform="V([0-9])_([0-9])_([^0-9].*):V\1.\2_\3" --symbol-transform="avendor:original" --exclude="(V1.0.1_for_SAKURA_with_comment|arelease)" --auto-props=cvs2svn.config --auto-props-ignore-case ..\Bregexp | tee bregexp.log

長いがそれぞれ1行.ラベル操作が大部分を占めている.完了するとsakura.dump及びbregexp.dumpが作られる.実 行時間はsakuraが400秒前後,Bregexpが5秒前後.Bregexpだけに-v (verbose)が付いているのはsakuraだとログが長くなりすぎるのでやめただけ.

結合

TortoiseSVNの「Create Repository Here」で空のディレクトリにFSFS形式のリポジトリを作成.それを別の空のディレクトリへチェックアウトする.

dumpをサブディレクトリへ展開するためには展開先が存在する必要があるので,sakura, Bregexpのディレクトリを作成 してAdd.ついでにtsvn:logminsizeプロパティを指定した.Addを行った時点でSVN管理ファイルと認識されてプロパティの設定が可能 となる.ディレクトリを作り終わったら親ディレクトリ(すなわちroot)を右クリックしてSVN Commitを実行.

その後で,上で作ったログを

svnadmin load --parent-dir Bregexp ..\svnroot < bregexp.dump
svnadmin load --parent-dir sakura ..\svnroot < sakura.dump

として一括Commitしてリポジトリの完成.

Sourceforge.netへ登録

結合準備

SourceForge.netでは--parent-dirを指定してのloadが可能なので上の別々のdumpファイルのままでよ い.代わりに上の結合手順をsourceforge.netのリポジトリに対して直接行う.手で行うと忘れたりするので,上の手順をバッチファイルに作っ ておいて,一気に行うのが安心.

mkdir Bregexp
mkdir sakura
mkdir help
mkdir work
svn add sakura Bregexp help work
svn propset tsvn:logtemplate 5 Bregexp sakura help

Sourceforge.netの準備

リポジトリの有効化

Sourceforge.netにログインして,Admin - Subversionを選択.最初にあるEnable Subversion?の チェックをクリックしてUpdate.これでメニューにSubversionが現れる.

アクセス権の追加

初期状態では誰にもアクセス権が与えられていないので,同じページの下の方にあるPermissions: の 文中のリンクをクリックしてProject Membersのページへ移って,開発者(まずは自分)にアクセス権を与える.

Top directory作成

Sourceforge.netよりCheckoutを行い,上で作ったスクリプトを使ってディレクトリを作成した後にチェックインする. Checkoutは誰でも出来るのでパスワードは聞かれない.Commit時にTortoiseSVNがユーザ名とパスワードを尋ねてくる.

Dumpファイルの登録

dumpファイルをproject disk spaceのルートへ転送する.gz, bz2, zipがサポートされているとあるので,いずれかを使ってまずは圧縮.その際ファイル名はアルファベットとピリオド以外は使えない.またサブディレクトリにおいてもダメ.

転送が完了したら上と同じくSourceforge.netにログインして,Admin - Subversionのページへ.ページ中央にMigration Instructions:というところがあり,その文中のmigrateからリンクが張られている(わかりづらい).

その先へ移動するとImportするデータ形式,ファイル名,インポート先を指定する画面になるので,それぞれSVN dumpfile,圧縮ファイル名,読み込み先を指定する.実行してから24時間以内に完了するとあるので,ステータスがWAITING→IN PROGRESS→COMPLETEDと変わるまで気長に待つ.

作業の注意点

cygwinを使わない

当初cygwinからcvs2svnを行ったら全てのファイルにsvn:executable属性が付けられてしまった.Linux同 様にファイルの実行フラグを反映しているのかもしれない.

途中停止時のcleanup

cvs2svnの実行中に間違いに気付いてCTRL+Cで処理を中断した場合作業ファイルが残る.それらを削除しないと次の実行時に異 常終了することがある.